UT 4: Desarrollo de aplicaciones web con PHP
1. Cookies
Una cookie es una variable un sitio web guarda en el entorno del usuario del navegador (normalmente en un fichero de texto o una pequeña base de datos). Su uso más típico es el almacenamiento de las preferencias del usuario (por ejemplo, el idioma en que se deben mostrar las páginas), para que no tenga que volver a indicarlas la próxima vez que visite el sitio.
Recomendación
Las herramientas para desarrolladores de Mozilla Firefox o Google Chrome te permiten ver e incluso editar las Cookies.
El servidor, al responder una petición, indica al navegador que almacene cookies en la cabecera de la respuesta:
HTTP/2.0 200 OK
Content-Type: text/html
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
[cuerpo de la petición]
Una vez el navegador tiene las cookies, cada vez que hace una petición al servidor las incluye en la cabecera de la petición:
GET /sample_page.html HTTP/2.0
Host: www.example.org
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
En PHP, para almacenar una cookie en el navegador del usuario, puedes utilizar la función setcookie. El único parámetro obligatorio que tienes que usar es el nombre de la cookie, pero admite varios parámetros más opcionales.
Por ejemplo, si quieres almacenar en una cookie la IP desde la que nos visitó el usuario por última vez, puedes hacer:
setcookie("ultima_ip", $_SERVER['REMOTE_ADDR'], time()+3600);
Los dos primeros parámetros son el nombre de la cookie y su valor. El tercero es la fecha de caducidad de la misma (una hora desde el momento en que se ejecute). En caso de no figurar este parámetro, la cookie se eliminará cuando se cierre el navegador. Ten en cuenta que también se pueden aplicar restricciones a las páginas del sitio que pueden acceder a una cookie en función de la ruta.
El proceso de recuperación de la información que almacena una cookie es muy simple. Cuando accedes a un sitio web, el navegador le envía de forma automática todo el contenido de las cookies que almacene relativas a ese sitio en concreto. Desde PHP puedes acceder a esta información por medio del array $_COOKIE.
echo $_COOKIE['ultima_ip'];
Siempre que utilices cookies en una aplicación web, debes tener en cuenta que en última instancia su disponibilidad está controlada por el cliente. Por ejemplo, algunos usuarios deshabilitan las cookies en el navegador porque piensan que la información que almacenan puede suponer un potencial problema de seguridad. O la información que almacenan puede llegar a perderse porque el usuario decide formatear el equipo o simplemente eliminarlas de su sistema.
Recomendación
Si una vez almacenada una cookie en el navegador quieres eliminarla antes de que expire, puedes utilizar la misma función setcookie pero indicando una fecha de caducidad anterior a la actual.
Ejercicio 4.1
Crea una página en la que almacenes en una cookie el último instante en que el usuario visitó la página. Si es su primera visita, muestra un mensaje de bienvenida. En caso contrario, muestra la fecha y hora de su anterior visita.
2. Manejo de sesiones
Como acabas de ver, una forma para guardar información particular de cada usuario es utilizar cookies. Sin embargo, existen diversos problemas asociados a las cookies, como el número de ellas que admite el navegador, o su tamaño máximo. Para solventar estos inconvenientes, existen las sesiones. El término sesión hace referencia al conjunto de información relativa a un usuario concreto. Esta información puede ser tan simple como el nombre del propio usuario, o más compleja, como los artículos que ha depositado en la cesta de compra de una tienda online.
Cada usuario distinto de un sitio web tiene su propia información de sesión. Para distinguir una sesión de otra se usan los identificadores de sesión (SID). Un SID es un atributo que se asigna a cada uno de los visitantes de un sitio web y lo identifica. De esta forma, si el servidor web conoce el SID de un usuario, puede relacionarlo con toda la información que posee sobre él, que se mantiene en la sesión del usuario. Esa información se almacena en el servidor web, generalmente en ficheros aunque también se pueden utilizar otros mecanismos de almacenamiento como bases de datos.
Como ya habrás supuesto, la cuestión ahora es: ¿y dónde se almacena ese SID, el identificador de la sesión, que es único para cada usuario? Pues existen dos maneras de mantener el SID entre las páginas de un sitio web que visita el usuario:
- Utilizando cookies, tal y como ya viste.
- Propagando el SID en un parámetro de la URL. El SID se añade como una parte más de la URL, de la forma
http://www.misitioweb.com/tienda/listado.php&PHPSESSID=34534fg4ffg34ty. En este ejemplo, el SID es el valor del parámetro PHPSESSID.
Ninguna de las dos maneras es perfecta. Ya sabes los problemas que tiene la utilización de cookies. Pese a ello, es el mejor método y el más utilizado. Propagar el SID como parte de la URL conlleva mayores desventajas, como la imposibilidad de mantener el SID entre distintas sesiones, o el hecho de que compartir la URL con otra persona implica compartir también el identificador de sesión.
La buena noticia, es que el proceso de manejo de sesiones en PHP está automatizado en gran medida. Cuando un usuario visita un sitio web, no es necesario programar un procedimiento para ver si existe un SID previo y cargar los datos asociados con el mismo. Tampoco tienes que utilizar la función setcookie si quieres almacenar los SID en cookies, o ir pasando el SID entre las páginas web de tu sitio si te decides por propagarlo. Todo esto PHP lo hace automáticamente.
A la información que se almacena en la sesión de un usuario también se le conoce como cookies del lado del servidor (server side cookies). Debes tener en cuenta que aunque esta información no viaja entre el cliente y el servidor, sí lo hace el SID, bien como parte de la URL o en un encabezado HTTP si se guarda en una cookie. En ambos casos, esto plantea un posible problema de seguridad. El SID puede ser conseguido por otra persona, y a partir del mismo obtener la información de la sesión del usuario. La manera más segura de utilizar sesiones es almacenando los SID en cookies y utilizar HTTPS para encriptar la información que se transmite entre el servidor web y el cliente.
2.1. Configuración
Por defecto, PHP incluye soporte de sesiones incorporado. Sin embargo, antes de utilizar sesiones en tu sitio web, debes configurar correctamente PHP utilizando las siguientes directivas en el fichero php.ini según corresponda:
| Directiva | Significado |
|---|---|
| session.use_cookies | Indica si se deben usar cookies (1) o propagación en la URL (0) para almacenar el SID. |
| session.use_only_cookies | Se debe activar (1) cuando utilizas cookies para almacenar los SID, y además no quieres que se reconozcan los SID que se puedan pasar como parte de la URL (este método se puede usar para usurpar el identificador de otro usuario). |
| session.save_handler | Se utiliza para indicar a PHP cómo debe almacenar los datos de la sesión del usuario. Existen cuatro opciones: en ficheros (files), en memoria (mm), en una base de datos SQLite (sqlite) o utilizando para ello funciones que debe definir el programador (user). El valor por defecto (files) funcionará sin problemas en la mayoría de los casos. |
| session.name | Determina el nombre de la cookie que se utilizará para guardar el SID. Su valor por defecto es PHPSESSID. |
| session.auto_start | Su valor por defecto es 0, y en este caso deberás usar la función session_start para gestionar el inicio de las sesiones. Si usas sesiones en el sitio web, puede ser buena idea cambiar su valor a 1 para que PHP active de forma automática el manejo de sesiones. |
| session.cookie_lifetime | Si utilizas la URL para propagar el SID, éste se perderá cuando cierres tu navegador. Sin embargo, si utilizas cookies, el SID se mantendrá mientras no se destruya la cookie. En su valor por defecto (0), las cookies se destruyen cuando se cierra el navegador. Si quieres que se mantenga el SID durante más tiempo, debes indicar en esta directiva ese tiempo en segundos. |
| session.gc_maxlifetime | Indica el tiempo en segundos que se debe mantener activa la sesión, aunque no haya ninguna actividad por parte del usuario. Su valor por defecto es 1440. Es decir, pasados 24 minutos desde la última actividad por parte del usuario, se cierra su sesión automáticamente. |
La función phpinfo, de la que ya hablamos con anterioridad, te ofrece información sobre la configuración actual de las directivas de sesión.
Para saber más
En la documentación de PHP tienes información sobre éstas y otras directivas que permiten configurar el manejo de sesiones.
2.2. Inicio y fin de una sesión
El inicio de una sesión puede tener lugar de dos formas. Si has activado la directiva session.auto_start en la configuración de PHP, la sesión comenzará automáticamente en cuanto un usuario se conecte a tu sitio web. En caso de que ese usuario ya haya abierto una sesión con anterioridad, y esta no se haya eliminado, en lugar de abrir una nueva sesión se reanudará la anterior. Para ello se utilizará el SID anterior, que estará almacenado en una cookie (recuerda que si usas propagación del SID, no podrás restaurar sesiones anteriores; el SID figura en la URL y se pierde cuando cierras el navegador).
Si por el contrario, decides no utilizar el inicio automático de sesiones, deberás ejecutar la función session_start para indicar a PHP que inicie una nueva sesión o reanude la anterior. Aunque anteriormente esta función devolvía siempre true, a partir de la versión 5.3.0 de PHP su comportamiento es más coherente: devuelve false en caso de no poder iniciar o restaurar la sesión.
Como el inicio de sesión requiere utilizar cookies, y éstas se transmiten en los encabezados HTTP, debes tener en cuenta que para poder iniciar una sesión utilizando session_start, tendrás que hacer las llamadas a esta función antes de que la página web muestre información en el navegador.
Además, todas las páginas que necesiten utilizar la información almacenada en la sesión, deberán ejecutar la función session_start.
Mientras la sesión permanece abierta, puedes utilizar la variable superglobal $_SESSION para añadir información a la sesión del usuario, o para acceder a la información almacenada en la sesión. Por ejemplo, para contar el número de veces que el usuario visita la página, puedes hacer:
// Iniciamos la sesión o recuperamos la anterior sesión existente
session_start();
// Comprobamos si la variable ya existe
if (isset($_SESSION['visitas']))
$_SESSION['visitas']++;
else
$_SESSION['visitas'] = 0;
Si en lugar del número de visitas, quisieras almacenar el instante en que se produce cada una, la variable de sesión visitas deberá ser un array y por tanto tendrás que cambiar el código anterior por:
// Iniciamos la sesión o recuperamos la anterior sesión existente
session_start();
// En cada visita añadimos un valor al array "visitas"
$_SESSION['visitas'][] = date('d-m-Y H:i:s');
Aunque como ya viste, puedes configurar PHP para que elimine de forma automática los datos de una sesión pasado cierto tiempo, en ocasiones puede ser necesario cerrarla de forma manual en un momento determinado. Por ejemplo, si utilizas sesiones para recordar la información de autentificación, deberás darle al usuario del sitio web la posibilidad de cerrar la sesión cuando lo crea conveniente.
En PHP tienes dos funciones para eliminar la información almacenada en la sesión:
- session_unset. Elimina las variables almacenadas en la sesión actual, pero no elimina la información de la sesión del dispositivo de almacenamiento usado.
- session_destroy. Elimina completamente la información de la sesión del dispositivo de almacenamiento.
¡Atención!
Aunque se use session_destroy, la sesión no se destruye hasta que termina la ejecución del programa, de forma que las variables de sesión estarán disponibles durante el resto de la ejecución del script.
Ejercicio 4.2
Crea una página similar a la anterior, almacenando en la sesión de usuario los instantes de todas sus últimas visitas. Si es su primera visita, muestra un mensaje de bienvenida. En caso contrario, muestra una lista de la fecha y hora de todas sus visitas anteriores. Añade un botón a la página que permita borrar el registro de visitas.
3. Autenticación de usuarios y control de acceso
Muchas veces es importante verificar la identidad de los dos extremos de una comunicación. En el caso de una comunicación web, existen métodos para identificar tanto al servidor en el que se aloja el sitio web, como al usuario del navegador que se encuentra en el otro extremo.
Los sitios web que necesitan emplear identificación del servidor, como las tiendas o los bancos, utilizan el protocolo HTTPS. Este protocolo requiere de un certificado válido, firmado por una autoridad confiable, que es verificado por el navegador cuando se accede al sitio web. Además, HTTPS utiliza métodos de cifrado para crear un canal seguro entre el navegador y el servidor, de tal forma que no se pueda interceptar la información que se transmite por el mismo.
Para identificar a los usuarios que visitan un sitio web, se pueden utilizar distintos métodos como el DNI digital o certificados digitales de usuario, pero el más extendido es solicitar al usuario cierta información que solo él conoce: la combinación de un nombre de usuario y una contraseña.
En la unidad anterior aprendiste a utilizar aplicaciones web para gestionar información almacenada en bases de datos. En la mayoría de los casos es importante implantar en este tipo de aplicaciones web, las que acceden a bases de datos, algún mecanismo de control de acceso que obligue al usuario a identificarse. Una vez identificado, se puede limitar el uso que puede hacer de la información.
Así, puede haber sitios web en los que los usuarios autentificados pueden utilizar sólo una parte de la información (como los bancos, que permiten a sus clientes acceder únicamente a la información relativa a sus cuentas). Otros sitios web necesitan separar en grupos a los usuarios autentificados, de tal forma que la información a la que accede un usuario depende del grupo en que éste se encuentre. Por ejemplo, una aplicación de gestión de una empresa puede tener un grupo de usuarios a los que permite visualizar la información, y otro grupo de usuarios que, además de visualizar la información, también la pueden modificar.
Atención
Debes distinguir la autentificación de los usuarios y el control de acceso, de la utilización de mecanismos para asegurar las comunicaciones entre el usuario del navegador y el servidor web. Aunque ambos aspectos suelen ir unidos, son independientes.
En los ejemplos de esta unidad, la información de autentificación (nombre y contraseña de los usuarios) se envía en texto plano desde el navegador hasta el servidor web. Esta práctica es altamente insegura y nunca debe usarse sin un protocolo como HTTPS que permita cifrar las comunicaciones con el servidor web. Sin embargo, la configuración de servidores web que permitan usar el protocolo HTTPS para cifrar la información que reciben y transmiten no forma parte de los contenidos de este módulo. Por este motivo, durante esta unidad utilizaremos únicamente el protocolo no seguro HTTP.
3.1. Mecanismos de autenticación
3.1.1. Protocolo HTTP
El protocolo HTTP ofrece un método sencillo para autentificar a los usuarios. El proceso es el siguiente:
- El servidor web debe proveer algún método para definir los usuarios que se utilizarán y cómo se pueden autenticar. Además, se tendrán que definir los recursos a los que se restringe el acceso y qué lista de control de acceso (ACL) se aplica a cada uno.
- Cuando un usuario no autentificado intenta acceder a un recurso restringido, el servidor web responde con un error de "Acceso no autorizado" (código 401).
- El navegador recibe el error y abre una ventana para solicitar al usuario que se autentifique mediante su nombre y contraseña.
- La información de autenticación del usuario se envía al servidor, que la verifica y decide si permite o no el acceso al recurso solicitado. Esta información se mantiene en el navegador para utilizarse en posteriores peticiones a ese servidor.
En el servidor web Apache, existe una utilidad en línea de comandos, htpasswd , que permite almacenar en un fichero una lista de usuarios y sus respectivas contraseñas. La información relativa a las contraseñas se almacena cifrada; aun así, es conveniente crear este fichero en un lugar no accesible por los usuarios del servidor web.
Por ejemplo, para crear el fichero de usuario y añadirle el usuario dwes haremos los siguiente:
sudo htpasswd -c users dwes
La opción -c indica que se debe crear el fichero, por lo que solo deberás usarla cuando introduzcas el primer usuario y contraseña. Fíjate que en el ejemplo anterior, el fichero se crea en la ruta /etc/apache2/users. En principio este fichero no es accesible vía web.
Si la consola indica que no encuentra el comando htpasswd puede deberse a que no esté instalado el paquete de utilidades de Apache, para ello sólo hay que ejecutar:
sudo apt-get install apache2-utils
Para indicarle al servidor Apache qué recursos tienen acceso restringido, una opción es crear un fichero .htaccess en el directorio en que se encuentren, con las siguientes directivas:
AuthName "Contenido restringido"
AuthType Basic
AuthUserFile /etc/apache2/users
require valid-user
El significado de cada una de las directivas anteriores es el siguiente:
| Directiva | Significado |
|---|---|
AuthName |
Nombre de dominio que se usará en la autentificación. Si el cliente se autentifica correctamente, esa misma información de autentificación se utilizará automáticamente en el resto de las páginas del mismo dominio |
AuthType |
Método de autentificación que se usará. Además del método Basic, Apache también permite utilizar el método Digest |
AuthUserFile |
Ruta al archivo de credenciales que has creado con htpasswd |
Require |
Permite indicar que sólo puedan acceder algunos usuarios o grupos de usuarios concretos. Si indicamos valid-user, podrán acceder todos los usuarios que se autentifiquen correctamente |
Además tendrás que asegurarte de que en la configuración de Apache se utiliza la directiva AllowOverride para que se aplique correctamente la configuración que figura en los ficheros .htaccess.
Hay una creencia errónea de que necesita usar ficheros .htaccess para configurar autenticación con contraseña. Este no es el caso. Colocar las directivas de autenticación en una sección <Directory>, en su fichero de configuración principal, es el método recomendado para configurar esto, y los ficheros .htaccess deberían usarse solamente si no tiene acceso al fichero de configuración principal del servidor.
Más información
Desde PHP puedes acceder a la información de autentificación HTTP que ha introducido el usuario utilizando el array superglobal $_SERVER.
| Valor | Contenido |
|---|---|
$_SERVER['PHP_AUTH_USER'] |
Nombre de usuario que se ha introducido. |
$_SERVER['PHP_AUTH_PW'] |
Contraseña introducida |
$_SERVER['AUTH_TYPE'] |
Método HTTP usado para autentificar. Puede ser Basic o Digest. |
Es decir, que si creas una página web que muestre los valores de estas variables, y preparas el servidor web para utilizar autentificación HTTP, cuando accedas a esa página con el usuario dwes obtendrás algo como lo siguiente:
<!DOCTYPE html>
<!-- Desarrollo Web en Entorno Servidor -->
<!-- Tema 4 : Desarrollo de aplicaciones web con PHP -->
<!-- Ejemplo: Autentificación HTTP -->
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Ejemplo Tema 4: Autenticación HTTP</title>
</head>
<body>
<?php
if (isset($_SERVER['PHP_AUTH_USER']) and
isset($_SERVER['PHP_AUTH_PW']) and
isset($_SERVER['AUTH_TYPE'])) {
echo "Nombre de usuario: ".$_SERVER['PHP_AUTH_USER']."<br />";
echo "Contraseña: ".$_SERVER['PHP_AUTH_PW']."<br />";
echo "Método de autentificación: ".$_SERVER['AUTH_TYPE']."<br />";
}
else
echo "No se ha autentificado";
?>
</body>
</html>
Si no introduces un usuario/contraseña válidos, el navegador te mostrará el error 401.
Recuerda que debes tener creado el fichero .htaccess en la ubicación donde ejecutas este ejemplo, para que solicite la autentificación.
Además, en PHP puedes usar la función header para forzar a que el servidor envíe un error de "Acceso no autorizado" (código 401). De esta forma no es necesario utilizar ficheros .htaccess para indicarle a Apache qué recursos están restringidos. En su lugar, puedes añadir las siguientes líneas en tus páginas PHP:
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic Realm="Contenido restringido"');
header('HTTP/1.0 401 Unauthorized');
echo "Usuario no reconocido!";
exit;
}
Debes conocer
La función header envía encabezados HTTP, pero debe utilizarse antes de que se muestre nada por pantalla. En caso contrario, obtendrás un error.
Con el código anterior, la página envía un error 401, lo que fuerza al navegador a solicitar las credenciales de acceso (nombre de usuario y contraseña). Si se introducen, se ejecuta el resto de la página y se muestra su contenido. En este caso, habría que añadir algún código para comprobar que el nombre de usuario y contraseña son válidos, tal y como veremos a continuación. Si se pulsa el botón Cancelar, se muestra el mensaje de error que se indica.
3.1.2. Formulario web
Otra opción muy utilizada para permitir la autenticación independiente del protocolo HTTP es utilizar un formulario y variables de sesión. Para que el usuario se pueda autentificar, normalmente se suele crear una página con un formulario de login:
<form action="login.php" method="post">
<label for="uname"><b>Username</b></label>
<input type="text" placeholder="Enter Username" name="uname" required>
<label for="psw"><b>Password</b></label>
<input type="password" placeholder="Enter Password" name="psw" required>
<button type="submit">Login</button>
</form>
En el procesamiento del usuario, si todo está correcto, se crea una variable de sesión que recoja datos de dicho usuario (por ejemplo el nombre de usuario):
$_SESSION['usuario'] = $_POST['uname'];
Si está sin definir, vacía o nula, se considera que el usuario no está "logueado".
if (!empty($_SESSION['usuario'])){
echo "Nombre de usuario: ".$_SESSION['usuario']."<br />";
} else {
echo "No se ha autentificado";
}
Para crear zonas a las que sólo puedan acceder usuarios registrados únicamente habría que comprobar la variable de sesión. Podemos devolver un error...
if (empty($_SESSION['usuario'])) {
header('HTTP/1.0 401 Unauthorized');
echo "Usuario no reconocido!";
exit;
}
...o redirigir al usuario a la página de login.
if (empty($_SESSION['usuario'])) {
header("Location:login.php");
exit;
}
Para desautenticar a un usuario únicamente habremos de borrar la variable de sesión o asignarle un valor nulo:
unset($_SESSION['usuario']);
$_SESSION['usuario'] = null;
Aunque lo más recomendable es destruir la sesión completa:
session_destroy();
3.2 Incorporación de métodos de autentificación a una aplicación web
Si utilizas la función header para forzar al navegador a solicitar credenciales HTTP, el usuario introducirá un nombre y una contraseña. Pero el servidor no verificará esta información; deberás ser tú quien provea un método para comprobar que las credenciales que ha introducido el usuario son correctas.
El método más simple es incluir en el código PHP de tu página las sentencias necesarias para comparar los datos introducidos con otros datos fijos. Por ejemplo, para permitir el acceso a un usuario dwes con contraseña abc123, puedes hacer:
if ($_SERVER['PHP_AUTH_USER']!='dwes' || $_SERVER['PHP_AUTH_PW']!='abc123') {
header('WWW-Authenticate: Basic Realm="Contenido restringido"');
header('HTTP/1.0 401 Unauthorized');
echo "Usuario no reconocido!";
exit;
}
Recuerda que el código PHP no se envía al navegador, por lo que la información de autentificación que introduzcas en el código no será visible por el usuario. Sin embargo, esto hará tu código menos portable. Si necesitas modificar el nombre de usuario o la contraseña, tendrás que hacer modificaciones en el código. Además, no podrás permitir al usuario introducir su propia contraseña.
Una solución mejor es utilizar un almacenamiento externo para los nombres de usuario y sus contraseñas. Para esto podrías emplear un fichero de texto, o mejor aún, una base de datos. La información de autentificación podrá estar aislada en su propia base de datos, o compartir espacio de almacenamiento con los datos que utilice tu aplicación web.
Aunque se podrían almacenar las contraseñas en texto plano, es mejor hacerlo almacenando su hash. De esta manera si alguien robara las bases de datos no obtendría las contraseñas. Para comprobar si una contraseña es correcta, calculamos su hash y lo comparamos con el que se encuentra almacenado en la base de datos.
Para saber más
Con frecuencia no se calcula el hash de la clave directamente, sino que antes se le concatena una cadena de caracteres conocida como [sal](https://es.wikipedia.org/wiki/Sal_(criptografía))
En PHP puedes usar la función md5 para calcular el hash MD5 de una cadena de texto. No obstante, aunque suele usarse mucho, no es muy recomendable usarla para el encriptado de contraseñas. Se recomienda usar el API de contraseñas, el cual además genera la sal de manera aleatoria.
<?php
$usuario = "lola25";
$nombre = "Lola Pérez";
$clave = password_hash("12341234", PASSWORD_DEFAULT);
$bd->exec('INSERT INTO usuarios (user, password, name)
VALUES ("' . $usuario . '", "' . $clave . '", "' . $nombre . '")');
$sql = "SELECT user, password FROM usuarios WHERE user = :username";
$consulta = $bd->prepare($sql);
$consulta->execute(["username" => $_POST['usuario']]);
$usuario = $consulta->fetch();
if (!empty($usuario) and password_verify($_POST['clave'], $usuario['password'])) {
$_SESSION['usuario'] = $usuario['user'];
echo '<h1>Bienvenido</h1>';
} else {
echo 'Usuario o clave incorrectos';
}
Ejercicio 4.3
Crea un formulario de inicio de sesión. Si la autenticación es correcta, la página debe mostrar un mensaje de bienvenida. En caso contrario, debe mostrar el formulario de inicio de sesión y un mensaje de error.
Los usuarios se deben almacenar en la base de datos, teniendo cuidado de no almacenar la contraseña en texto plano sino su hash. Se propone usar el siguiente código SQL:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
CREATE TABLE `usuarios` (
`id_usuario` int(10) UNSIGNED NOT NULL,
`user` varchar(255) COLLATE utf8_bin NOT NULL UNIQUE,
`password` varchar(255) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `usuarios` ADD PRIMARY KEY (`id_usuario`);
ALTER TABLE `usuarios`
MODIFY `id_usuario` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
Prácticas
Práctica 1
Vamos a crear una página web sólo para usuarios. Esta web va a tener 3 páginas:
zona_restringida.php: Página web sólo visitable por usuarios registrados.login.php: formulario de inicio de sesión.logout.php: página que cierra la sesión.
Previamente habrá que crear una tabla "usuarios" usando el código SQL adjunto y rellenarla con varios usuarios inventados. Para ello Utiliza un script PHP que simplemente cree usuarios y los guarde en la base de datos. No almacenes las contraseñas en texto plano, usa la API de contraseñas.
Consideraciones:
- Si al hacer login este es correcto, almacena en variables de sesión el nombre de usuario y su nombre real.
- Cuando el usuario visite
logout.php, destruye la sesión y manda al usuario a login.php. - En la zona restringida se debe mostrar el nombre real del usuario y un enlace a
logout.phppara cerrar sesión. - Si el usuario hace login correctamente, mándalo a la zona restringida.
- Si un usuario con sesión abierta intenta acceder a login, mándalo a la zona restringida.
- Si alguien intenta acceder al área restringida sin estar autenticado, mándalo al login.
- Utiliza una cookie para controlar que se muestre un mensaje de bienvenida la primera vez que se acceda a la zona restringida.
Código SQL
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
CREATE TABLE `usuarios` (
`id_usuario` int(10) UNSIGNED NOT NULL,
`user` varchar(255) COLLATE utf8_bin NOT NULL UNIQUE,
`password` varchar(255) COLLATE utf8_bin NOT NULL,
`name` varchar(255) COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `usuarios`
ADD PRIMARY KEY (`id_usuario`);
ALTER TABLE `usuarios`
MODIFY `id_usuario` int(10) UNSIGNED
NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
Ejercicios de ampliación
Ampliación 1: Roles
Partiendo de la práctica 1, añade una columna en la base de datos llamada "rol" en las que unos sean usuarios y otros administradores.
Crea una página llamada zona_administración.php a la que sólo puedan acceder administradores en la que se muestre un listado de los usuarios, con su rol y su nombre real.
Si intenta acceder un usuario normal, se le muestra un mensaje que le informa de que esa página sólo está disponible para administradores.
Si intenta acceder alguien sin autenticar, se le debe redirigir a login.php.
Modifica zona_restringida.php para que, si el usuario es administrador, le aparezca un enlace a la zona de administración.
Ampliación 2: Formulario de registro
Partiendo de la práctica 1, añade una página llamada register.php en la que, mediante un formulario, se puedan crear usuarios.
Si la creación es correcta, se inicia sesión automáticamente y se manda al usuario a la zona restringida.
Si un usuario autenticado intenta acceder al formulario de registro, se le muestra un mensaje diciendo que el usuario ya tiene una sesión iniciada.